www.gusucode.com > VC++ 颜色空间转换以及各种颜色变换源码程序 > VC++ 颜色空间转换以及各种颜色变换源码程序/code/ColorProcess/ColorProcessView.cpp

    //Download by http://www.NewXing.com
// ColorProcessView.cpp : implementation of the CColorProcessView class
//

#include "stdafx.h"
#include "ColorProcess.h"
#include "MainFrm.h"
#include "GrayDlg.h"
#include "BCDlg.h"
#include "AdjustColorDlg.h"
#include "ColorBitsDlg.h"
#include "GammaCorrection.h"
#include "ExposureDlg.h"
#include "ColorProcessDoc.h"
#include "ColorProcessView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CColorProcessView

IMPLEMENT_DYNCREATE(CColorProcessView, CScrollView)

BEGIN_MESSAGE_MAP(CColorProcessView, CScrollView)
	//{{AFX_MSG_MAP(CColorProcessView)
	ON_COMMAND(IDM_ADJUSTCOLOR, OnAdjustcolor)
	ON_UPDATE_COMMAND_UI(IDM_ADJUSTCOLOR, OnUpdateAdjustcolor)
	ON_COMMAND(IDM_BC, OnBc)
	ON_UPDATE_COMMAND_UI(IDM_BC, OnUpdateBc)
	ON_COMMAND(IDM_COLORBITS, OnColorbits)
	ON_UPDATE_COMMAND_UI(IDM_COLORBITS, OnUpdateColorbits)
	ON_COMMAND(IDM_GRAY, OnGray)
	ON_UPDATE_COMMAND_UI(IDM_GRAY, OnUpdateGray)
	ON_COMMAND(IDM_BLUE, OnBlue)
	ON_UPDATE_COMMAND_UI(IDM_BLUE, OnUpdateBlue)
	ON_COMMAND(IDM_GETBLUE, OnGetblue)
	ON_UPDATE_COMMAND_UI(IDM_GETBLUE, OnUpdateGetblue)
	ON_COMMAND(IDM_GETGREEN, OnGetgreen)
	ON_UPDATE_COMMAND_UI(IDM_GETGREEN, OnUpdateGetgreen)
	ON_COMMAND(IDM_GETRED, OnGetred)
	ON_UPDATE_COMMAND_UI(IDM_GETRED, OnUpdateGetred)
	ON_COMMAND(IDM_GREEN, OnGreen)
	ON_UPDATE_COMMAND_UI(IDM_GREEN, OnUpdateGreen)
	ON_COMMAND(IDM_RED, OnRed)
	ON_UPDATE_COMMAND_UI(IDM_RED, OnUpdateRed)
	ON_COMMAND(IDM_CORRECTGAMMA, OnCorrectgamma)
	ON_UPDATE_COMMAND_UI(IDM_CORRECTGAMMA, OnUpdateCorrectgamma)
	ON_COMMAND(IDM_NEGATIVE, OnNegative)
	ON_UPDATE_COMMAND_UI(IDM_NEGATIVE, OnUpdateNegative)
	ON_COMMAND(IDM_EXPOSURE, OnExposure)
	ON_UPDATE_COMMAND_UI(IDM_EXPOSURE, OnUpdateExposure)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
	ON_MESSAGE(WM_REALIZEPAL, OnRealizePal)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CColorProcessView construction/destruction

CColorProcessView::CColorProcessView()
{
	// TODO: add construction code here

}

CColorProcessView::~CColorProcessView()
{
}

BOOL CColorProcessView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CColorProcessView drawing

void CColorProcessView::OnDraw(CDC* pDC)
{
	CColorProcessDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (! pDoc->m_pDib->IsEmpty())
		pDoc->m_pDib->Display(pDC, 0, 0);
}

void CColorProcessView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();
	CColorProcessDoc* pDoc = GetDocument();

	CSize sizeTotal(pDoc->m_pDib->GetWidth(), pDoc->m_pDib->GetHeight());
	SetScrollSizes(MM_TEXT, sizeTotal);
	
	CMainFrame* pAppFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
	ASSERT_KINDOF(CMainFrame, pAppFrame);
	CRect rc;
	pAppFrame->GetClientRect(&rc);
	if (rc.Width() >= sizeTotal.cx && rc.Height() >= sizeTotal.cy &&
		(sizeTotal.cx>0 || sizeTotal.cy>0))
		ResizeParentToFit(FALSE);
}

/////////////////////////////////////////////////////////////////////////////
// CColorProcessView printing

BOOL CColorProcessView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CColorProcessView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CColorProcessView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CColorProcessView diagnostics

#ifdef _DEBUG
void CColorProcessView::AssertValid() const
{
	CScrollView::AssertValid();
}

void CColorProcessView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

CColorProcessDoc* CColorProcessView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CColorProcessDoc)));
	return (CColorProcessDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CColorProcessView message handlers

LRESULT CColorProcessView::OnRealizePal(WPARAM wParam, LPARAM lParam)
{
	ASSERT(wParam != NULL);
	CColorProcessDoc* pDoc = GetDocument();

	if (pDoc->m_pDib->IsEmpty())
		return 0L;  // must be a new document

	CPalette* pPal = pDoc->m_pDib->GetPalette();
	if (pPal != NULL)
	{
		CWnd* pAppFrame = AfxGetApp()->m_pMainWnd;

		CClientDC appDC(pAppFrame);
		// All views but one should be a background palette.
		// wParam contains a handle to the active view, so the SelectPalette
		// bForceBackground flag is FALSE only if wParam == m_hWnd (this view)
		CPalette* oldPalette = appDC.SelectPalette(pPal, ((HWND)wParam) != m_hWnd);

		if (oldPalette != NULL)
		{
			UINT nColorsChanged = appDC.RealizePalette();
			if (nColorsChanged > 0)
				GetDocument()->UpdateAllViews(NULL);
			appDC.SelectPalette(oldPalette, TRUE);
		}
		else
		{
			TRACE0("\tSelectPalette failed!\n");
		}
	}

	return 0L;
}

void CColorProcessView::OnAdjustcolor() 
{
	CColorProcessDoc* pDoc = GetDocument();
	CAdjustColorDlg colorDlg(this);

	if (colorDlg.DoModal() == IDOK)
	{
		pDoc->m_pDib->AdjustColor(colorDlg.m_nColorModel, 
								  colorDlg.m_nValue1, 
							      colorDlg.m_nValue2, 
							      colorDlg.m_nValue3); 
		pDoc->SetModifiedFlag(TRUE);
		OnRealizePal((WPARAM)m_hWnd,0);  // realize the new palette
		pDoc->UpdateAllViews(NULL);
	}
}

void CColorProcessView::OnUpdateAdjustcolor(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(! GetDocument()->m_pDib->IsEmpty());
}

void CColorProcessView::OnBc() 
{
	CColorProcessDoc* pDoc = GetDocument();
	CBCDlg bcDlg(this);

	if (bcDlg.DoModal() == IDOK)
	{
		pDoc->m_pDib->AdjustBrightness(bcDlg.m_nValue1);
		pDoc->m_pDib->AdjustContrast(bcDlg.m_nValue2);
		pDoc->SetModifiedFlag(TRUE);
		OnRealizePal((WPARAM)m_hWnd,0);  // realize the new palette
		pDoc->UpdateAllViews(NULL);
	}
}

void CColorProcessView::OnUpdateBc(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(! GetDocument()->m_pDib->IsEmpty());
}

void CColorProcessView::OnColorbits() 
{
	CColorProcessDoc* pDoc = GetDocument();
	CColorBitsDlg colorBitsDlg((int)pDoc->m_pDib->GetBitCount(), this);

	if (colorBitsDlg.DoModal() == IDOK)
	{
	 	pDoc->m_pDib->ColorQuantize(colorBitsDlg.m_nColorBits);

		pDoc->SetModifiedFlag(TRUE);
		OnRealizePal((WPARAM)m_hWnd,0);  // realize the new palette
		pDoc->UpdateAllViews(NULL);
	}
}

void CColorProcessView::OnUpdateColorbits(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(! GetDocument()->m_pDib->IsEmpty());
}

void CColorProcessView::OnGray() 
{
	CColorProcessDoc* pDoc = GetDocument();
	CGrayDlg grayDlg(this);

	if (grayDlg.DoModal() == IDOK)
	{
		pDoc->m_pDib->ChangeToGrayscale(grayDlg.m_nMethod, 
							  grayDlg.m_fWeightR, 
							  grayDlg.m_fWeightG, 
							  grayDlg.m_fWeightB);
		pDoc->SetModifiedFlag(TRUE);
		OnRealizePal((WPARAM)m_hWnd,0);  // realize the new palette
		pDoc->UpdateAllViews(NULL);
	}
}

void CColorProcessView::OnUpdateGray(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(! GetDocument()->m_pDib->IsEmpty());
}

void CColorProcessView::OnRed() 
{
	CColorProcessDoc* pDoc = GetDocument();
	pDoc->m_pDib->FilteRGB(FILTE_RED);

	pDoc->SetModifiedFlag(TRUE);
	OnRealizePal((WPARAM)m_hWnd,0);  // realize the new palette
	pDoc->UpdateAllViews(NULL);
}

void CColorProcessView::OnUpdateRed(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(! GetDocument()->m_pDib->IsEmpty());
}

void CColorProcessView::OnGreen() 
{
	CColorProcessDoc* pDoc = GetDocument();
	pDoc->m_pDib->FilteRGB(FILTE_GREEN);

	pDoc->SetModifiedFlag(TRUE);
	OnRealizePal((WPARAM)m_hWnd,0);  // realize the new palette
	pDoc->UpdateAllViews(NULL);
}

void CColorProcessView::OnUpdateGreen(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(! GetDocument()->m_pDib->IsEmpty());
}

void CColorProcessView::OnBlue() 
{
	CColorProcessDoc* pDoc = GetDocument();
	pDoc->m_pDib->FilteRGB(FILTE_BLUE);

	pDoc->SetModifiedFlag(TRUE);
	OnRealizePal((WPARAM)m_hWnd,0);  // realize the new palette
	pDoc->UpdateAllViews(NULL);
}

void CColorProcessView::OnUpdateBlue(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(! GetDocument()->m_pDib->IsEmpty());
}

void CColorProcessView::OnGetblue() 
{
	CColorProcessDoc* pDoc = GetDocument();
	pDoc->m_pDib->SeparateRGB(SEPARATE_BLUE);

	pDoc->SetModifiedFlag(TRUE);
	OnRealizePal((WPARAM)m_hWnd,0);  // realize the new palette
	pDoc->UpdateAllViews(NULL);
}

void CColorProcessView::OnUpdateGetblue(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(! GetDocument()->m_pDib->IsEmpty());
}

void CColorProcessView::OnGetgreen() 
{
	CColorProcessDoc* pDoc = GetDocument();
	pDoc->m_pDib->SeparateRGB(SEPARATE_GREEN);

	pDoc->SetModifiedFlag(TRUE);
	OnRealizePal((WPARAM)m_hWnd,0);  // realize the new palette
	pDoc->UpdateAllViews(NULL);
}

void CColorProcessView::OnUpdateGetgreen(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(! GetDocument()->m_pDib->IsEmpty());
}

void CColorProcessView::OnGetred() 
{
	CColorProcessDoc* pDoc = GetDocument();
	pDoc->m_pDib->SeparateRGB(SEPARATE_RED);

	pDoc->SetModifiedFlag(TRUE);
	OnRealizePal((WPARAM)m_hWnd,0);  // realize the new palette
	pDoc->UpdateAllViews(NULL);
}

void CColorProcessView::OnUpdateGetred(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(! GetDocument()->m_pDib->IsEmpty());
}

void CColorProcessView::OnCorrectgamma() 
{
	CColorProcessDoc* pDoc = GetDocument();
	CGammaCorrection gammaDlg(this);

	if (gammaDlg.DoModal() == IDOK)
	{
		pDoc->m_pDib->CorrectGamma(gammaDlg.m_fGamma);
		pDoc->SetModifiedFlag(TRUE);
		OnRealizePal((WPARAM)m_hWnd,0);  // realize the new palette
		pDoc->UpdateAllViews(NULL);
	}
}

void CColorProcessView::OnUpdateCorrectgamma(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(! GetDocument()->m_pDib->IsEmpty());
}

void CColorProcessView::OnNegative() 
{
	CColorProcessDoc* pDoc = GetDocument();
	pDoc->m_pDib->Negative();
	pDoc->SetModifiedFlag(TRUE);
	OnRealizePal((WPARAM)m_hWnd,0);  // realize the new palette
	pDoc->UpdateAllViews(NULL);
}

void CColorProcessView::OnUpdateNegative(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(! GetDocument()->m_pDib->IsEmpty());
}

void CColorProcessView::OnExposure() 
{
	CColorProcessDoc* pDoc = GetDocument();
	CExposureDlg exposureDlg(this);

	if (exposureDlg.DoModal() == IDOK)
	{
		pDoc->m_pDib->Exposure(exposureDlg.m_nThreshold);
		pDoc->SetModifiedFlag(TRUE);
		OnRealizePal((WPARAM)m_hWnd,0);  // realize the new palette
		pDoc->UpdateAllViews(NULL);
	}
}

void CColorProcessView::OnUpdateExposure(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(! GetDocument()->m_pDib->IsEmpty());
}